package com.citybike.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Pattern;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.google.android.gms.maps.model.LatLng;

public class PathJSONParser {
	
	public List<List<HashMap<String, String>>> parseRouteQuery(JSONObject jObject) {
		List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String, String>>>();
	    JSONArray jRoutes = null;
	    JSONArray jLegs = null;
	    JSONArray jSteps = null;
	    try {
	    	jRoutes = jObject.getJSONArray("routes");
	    	/** Traversing all routes */
	    	for (int i = 0; i < jRoutes.length(); i++) {
	    		jLegs = ((JSONObject) jRoutes.get(i)).getJSONArray("legs");
	    		List<HashMap<String, String>> path = new ArrayList<HashMap<String, String>>();
	 
	    		/** Traversing all legs */
	    		for (int j = 0; j < jLegs.length(); j++) {
	    			jSteps = ((JSONObject) jLegs.get(j)).getJSONArray("steps");
	 
	    			/** Traversing all steps */
	    			for (int k = 0; k < jSteps.length(); k++) {
	    				String polyline = "";
	    				polyline = (String) ((JSONObject) ((JSONObject) jSteps.get(k)).get("polyline")).get("points");
	    				List<LatLng> list = decodePoly(polyline);
	 
	    				/** Traversing all points */
	    				for (int l = 0; l < list.size(); l++) {
	    					HashMap<String, String> hm = new HashMap<String, String>();
	    					hm.put("lat", Double.toString(((LatLng) list.get(l)).latitude));
	    					hm.put("lng", Double.toString(((LatLng) list.get(l)).longitude));
	    					path.add(hm);
	    				}
	    			}
	    			routes.add(path);
	    		}
	    	}
	 
	    	} catch (JSONException e) {
	    		e.printStackTrace();
	    	} catch (Exception e) {
	    	}
	    	return routes;
	}
	
	private List<LatLng> decodePoly(String encoded) {
		List<LatLng> poly = new ArrayList<LatLng>();
	    int index = 0, len = encoded.length();
	    int lat = 0, lng = 0;
	 
	    while (index < len) {
	    	int b, shift = 0, result = 0;
	    	do {
	    		b = encoded.charAt(index++) - 63;
	    		result |= (b & 0x1f) << shift;
	    		shift += 5;
	    	} while (b >= 0x20);
	    	int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
	    	lat += dlat;
	 
	    	shift = 0;
	    	result = 0;
	    	do {
		        b = encoded.charAt(index++) - 63;
		        result |= (b & 0x1f) << shift;
		        shift += 5;
	    	} while (b >= 0x20);
	    	int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
	    	lng += dlng;
	 
	    	LatLng p = new LatLng((((double) lat / 1E5)), (((double) lng / 1E5)));
	    	poly.add(p);
	    }
	    
	    return poly;
	}
	
	
	public static List<LatLng> parseBikePath(String jsonString){
		//{"type":"MultiLineString","coordinates":[[[-58.49166,-34.57985],[-58.49107,-34.58061]]]}
		int beginIndex = jsonString.indexOf("[[[") + 3;
		int endIndex = jsonString.lastIndexOf("]]]");
		String pointsRegister = jsonString.substring(beginIndex, endIndex);
		//-58.49166,-34.57985],[-58.49107,-34.58061
		String stringPoints[] = pointsRegister.split( Pattern.quote("],[") );
		//-58.49166,-34.57985
		ArrayList<LatLng> points = new ArrayList<LatLng>();
		double lat, lng;
		for(int i = 0; i < stringPoints.length; i++){
			lat = Double.parseDouble( stringPoints[i].substring(0, stringPoints[i].indexOf(',')) );
			lng = Double.parseDouble( stringPoints[i].substring(stringPoints[i].indexOf(',') + 1) );
			points.add( new LatLng(lat, lng) );
		}
		return points;
	}
}
